package aQute.junit; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.List; import org.osgi.framework.Bundle; import org.osgi.framework.BundleContext; import org.osgi.framework.FrameworkUtil; import junit.framework.AssertionFailedError; import junit.framework.Test; import junit.framework.TestListener; import junit.framework.TestResult; public class BasicTestReport implements TestListener, TestReporter { private int errors; private final Tee systemOut; private final Tee systemErr; private int fails; private Bundle targetBundle; private final Activator activator; private final TestResult result; public BasicTestReport(Activator activator, Tee systemOut, Tee systemErr, TestResult result) { this.systemOut = systemOut; this.systemErr = systemErr; this.activator = activator; this.result = result; } public void setup(Bundle fw, Bundle targetBundle) { this.targetBundle = targetBundle; } public void begin(List<Test> tests, int realcount) { activator.trace(">>>> %s, tests %s", targetBundle, tests); } public void addError(Test test, Throwable t) { if (activator.isTrace()) { activator.trace(" add error to %s : %s", test, t); } else { systemErr.capture(false); try { activator.message("", "TEST %s <<< ERROR: %s", test, t); } finally { systemErr.capture(true); } } check(); } public void addFailure(Test test, AssertionFailedError t) { if (activator.isTrace()) { activator.trace(" add failure to %s : %s", test, t); } else { systemErr.capture(false); try { activator.message("", "TEST %s <<< FAILURE: %s", test, t); } finally { systemErr.capture(true); } } check(); } public void startTest(Test test) { activator.trace(" >> %s", test); check(); Bundle b = targetBundle; if (b == null) b = FrameworkUtil.getBundle(test.getClass()); if (b != null) { BundleContext context = b.getBundleContext(); activator.trace("got bundle context %s from %s in state %s", context, b, b.getState()); assert context != null; try { Method m = test.getClass().getMethod("setBundleContext", new Class[] { BundleContext.class }); m.setAccessible(true); m.invoke(test, new Object[] { context }); activator.trace("set context through setter"); } catch (Exception e) { Field f; try { f = test.getClass().getField("context"); f.setAccessible(true); f.set(test, context); activator.trace("set context in field"); } catch (Exception e1) { // Ok, no problem } } } fails = result.failureCount(); errors = result.errorCount(); systemOut.clear().capture(true).echo(true); systemErr.clear().capture(true).echo(true); } public void endTest(Test test) { activator.trace(" << %s, fails=%s, errors=%s", test, result.failureCount(), result.errorCount()); systemOut.capture(false); systemErr.capture(false); if ((result.failureCount() > fails) || (result.errorCount() > errors)) { String sysout = systemOut.getContent(); String syserr = systemErr.getContent(); if (sysout != null) activator.trace("out: %s", sysout); if (syserr != null) { activator.trace("err: %s", syserr); } } check(); } public void end() { activator.trace("<<<<"); } public void aborted() { activator.trace("ABORTED"); } private void check() { if (!activator.active()) { result.stop(); } } String[] getCaptured() { return new String[] { systemOut.getContent(), systemErr.getContent() }; } TestResult getTestResult() { return result; } }